package x.ovo.wechat.bot;

import x.ovo.wechat.bot.common.entity.Contact;
import x.ovo.wechat.bot.common.entity.event.MessageEvent;
import x.ovo.wechat.bot.common.entity.message.TextMessage;
import x.ovo.wechat.bot.common.event.Event;
import x.ovo.wechat.bot.common.event.EventListener;
import x.ovo.wechat.bot.common.util.WechatUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class RereadListener extends EventListener<MessageEvent<TextMessage>> {

    private final Map<String, String> map = new HashMap<>(16);
    private final Map<String, String> flagMap = new HashMap<>(16);

    @Override
    public boolean support(Event<?> event) {
        return event instanceof MessageEvent && event.getSource() instanceof TextMessage;
    }

    @Override
    /**
     * 处理接收到的消息事件。
     *
     * @param event 包含消息内容和来源等信息的事件对象，类型为 MessageEvent<TextMessage>。
     *              其中，TextMessage 是消息的具体内容，包含消息是否为群消息、发送者信息、接收者名称以及消息内容等。
     *              该函数不返回任何结果，即 void 类型。
     */
    public void onEvent(MessageEvent<TextMessage> event) {
        // 获取消息对象，并判断是否为群消息，如果不是则不处理
        TextMessage message = event.getSource();
        if (!message.isGroup()) return;

        // 获取消息发送者信息、接收者名称以及消息内容
        Contact fromUser = message.getFromUser();
        String name = message.getToName();
        String content = message.getContent();

        // 检查消息内容是否与之前收到的相同，且不与标记内容相同。如果满足条件，则将该内容标记，并向发送者回复相同内容。
        if (Objects.equals(content, this.map.get(name)) && !Objects.equals(content, this.flagMap.get(name))) {
            this.flagMap.put(name, content);
            this.context.getApi().sendText(fromUser.getUserName(), WechatUtil.format(content));
            return;
        }
        // 更新接收到的消息内容到 map 中
        this.map.put(name, content);
    }
}
